/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.datamodel.LazyPropostaModelo;
import br.jm.financeiro.entity.PropostaEtapa;
import br.jm.financeiro.entity.PropostaEtapaDesc;
import br.jm.financeiro.entity.PropostaEtapaPerc;
import br.jm.financeiro.entity.PropostaModelo;
import br.jm.financeiro.filter.UploadArquivo;
import br.jm.financeiro.sistema.eao.PropostaEtapaDescEao;
import br.jm.financeiro.sistema.eao.PropostaEtapaEao;
import br.jm.financeiro.sistema.eao.PropostaModeloEao;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import net.sf.jooreports.templates.DocumentTemplate;
import net.sf.jooreports.templates.DocumentTemplateException;
import net.sf.jooreports.templates.DocumentTemplateFactory;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class PropostaModeloBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private PropostaModelo selectedPropostaModelo;
    private LazyDataModel<PropostaModelo> lazyModel;
    private final PropostaModeloEao propostaModeloEAO;
    private FacesMessage msg = null;
    private boolean altera;
    private PropostaEtapa selectedPropostaEtapa;
    private PropostaEtapaDesc selectedPropostaEtapaDesc;
    private PropostaEtapaPerc selectedPropostaEtapaPerc;
    private List<PropostaEtapa> PropostaEtapaList;
    private List<PropostaEtapaDesc> PropostaEtapaDescList;
    private final PropostaEtapaEao propostaEtapaEAO;
    private final PropostaEtapaDescEao propostaEtapaDescEAO;
    private Map<String, String> etapas;
    private String cEditor;
    private String itemlogo;
    private final UploadArquivo arquivo = new UploadArquivo();

    public PropostaModeloBean() throws EaoException {
        propostaModeloEAO = PropostaModeloEao.getInstance();
        propostaEtapaEAO = PropostaEtapaEao.getInstance();
        propostaEtapaDescEAO = PropostaEtapaDescEao.getInstance();

        selectedPropostaEtapa = new PropostaEtapa();
        selectedPropostaModelo = new PropostaModelo();
        selectedPropostaModelo.setIdEtapa(selectedPropostaEtapa);
        
        selectedPropostaEtapaDesc = new PropostaEtapaDesc();
        selectedPropostaEtapaPerc = new PropostaEtapaPerc();

        PropostaEtapaDescList = new ArrayList<>();

        this.etapas = new HashMap<>();

        PropostaEtapaList = propostaEtapaEAO.getNative("PropostaEtapa", 0, propostaEtapaEAO.getCount("PropostaEtapa"), null, true, null, null);

        for (PropostaEtapa PropostaEtapaList1 : PropostaEtapaList) {
            selectedPropostaEtapa = PropostaEtapaList1;
            this.etapas.put(selectedPropostaEtapa.getNomEtapa(), selectedPropostaEtapa.getIdEtapa().toString());
        }

        lazyModel = new LazyPropostaModelo(propostaModeloEAO);
    }

    public PropostaModelo getSelectedPropostaModelo() {
        return selectedPropostaModelo;
    }

    public void setSelectedPropostaModelo(PropostaModelo selectedPropostaModelo) {
        this.selectedPropostaModelo = selectedPropostaModelo;
    }

    public LazyDataModel<PropostaModelo> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<PropostaModelo> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public void inserir(ActionEvent actionEvent) {
        try {
            if (selectedPropostaModelo.getDscModelo().trim().isEmpty()) {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório Inserir Descrição do Modelo de Proposta", "");
            } else {
                selectedPropostaModelo.setIdModelo(null);

                propostaModeloEAO.create(selectedPropostaModelo);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Modelo de Proposta Inserido com Sucesso: ".concat(selectedPropostaModelo.getDscModelo())), selectedPropostaModelo.getDscModelo());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir" + selectedPropostaModelo.getDscModelo(), e.getMessage());
        } finally {
            this.preparaInserir(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        try {
            if (selectedPropostaModelo.getDscModelo().trim().isEmpty()) {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório Inserir Descrição do Modelo de Proposta", "");
            } else {
                String cIdEtapa = this.selectedPropostaModelo.getIdEtapa().getIdEtapa().toString();
                String cFiltro = " id_etapa = ".concat(cIdEtapa);
                PropostaEtapaDescList = propostaEtapaDescEAO.getNative("PropostaEtapaDesc", 0, propostaEtapaDescEAO.getCount("PropostaEtapaDesc"), null, true, null, null, cFiltro);
                selectedPropostaModelo.getIdEtapa().setPropostaEtapaDescList(PropostaEtapaDescList);
                propostaModeloEAO.edit(selectedPropostaModelo);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Modelo de Proposta Alterado com Sucesso: ".concat(selectedPropostaModelo.getDscModelo())), selectedPropostaModelo.getDscModelo());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedPropostaModelo.getDscModelo(), e.getMessage());
        } finally {
            this.preparaInserir(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        try {
            propostaModeloEAO.destroy(selectedPropostaModelo);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Modelo de Proposta Excluido com Sucesso: ".concat(selectedPropostaModelo.getDscModelo())), selectedPropostaModelo.getDscModelo());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + selectedPropostaModelo.getDscModelo(), e.getMessage());
        } finally {
            this.preparaInserir(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void preparaInserir(ActionEvent actionEvent) {
        this.altera = true;
        selectedPropostaEtapa = new PropostaEtapa();
        selectedPropostaModelo = new PropostaModelo();
        selectedPropostaModelo.setIdEtapa(selectedPropostaEtapa);
        this.selectedPropostaModelo.setDscModelo(" ");
        this.selectedPropostaModelo.setModelo(" ");
    }

    public boolean isAltera() {
        return altera;
    }

    public void setAltera(boolean altera) {
        this.altera = altera;
    }

    public PropostaEtapa getSelectedPropostaEtapa() {
        return selectedPropostaEtapa;
    }

    public void setSelectedPropostaEtapa(PropostaEtapa selectedPropostaEtapa) throws EaoException {
        this.selectedPropostaModelo.setIdEtapa(selectedPropostaEtapa);
        this.selectedPropostaEtapa = selectedPropostaEtapa;
        metodo();
    }

    public List<PropostaEtapa> getPropostaEtapaList() {
        return PropostaEtapaList;
    }

    public void setPropostaEtapaList(List<PropostaEtapa> PropostaEtapaList) {
        this.PropostaEtapaList = PropostaEtapaList;
    }

    public void metodo() throws EaoException {
        String cDescritivo = "";
        String cEtapa = "";
        String cHonorarios = "";

        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        this.cEditor = map.get("frmPropostaModelo:editorModelo");

        if (this.cEditor == null) {
            this.cEditor = "";
        } else {
            this.cEditor += "\n";
        }

        String cIdEtapa = this.selectedPropostaEtapa.getIdEtapa().toString();
        String cFiltro = " id_etapa = ".concat(cIdEtapa);
        PropostaEtapaDescList = propostaEtapaDescEAO.getNative("PropostaEtapaDesc", 0, propostaEtapaDescEAO.getCount("PropostaEtapaDesc"), null, true, null, null, cFiltro);

        if (PropostaEtapaDescList.size() > 0) {
            List<String> aDescritivo = new ArrayList<>();
            List<String> aHonorarios = new ArrayList<>();
            // Descritivo da Etapa
            for (PropostaEtapaDesc PropostaEtapaDescList1 : PropostaEtapaDescList) {
                cEtapa = "";
                cDescritivo = "";
                this.selectedPropostaEtapaDesc = PropostaEtapaDescList1;
                cEtapa += "ETAPA ".concat(this.selectedPropostaEtapaDesc.getNumEtapa().trim());
                cDescritivo += cEtapa.concat(" - ").concat(this.selectedPropostaEtapaDesc.getDscEtapa1()).concat(" ").concat("\n");
                aDescritivo.add(cDescritivo);
                aDescritivo.add(this.selectedPropostaEtapaDesc.getObsEtapa1().concat("\n"));
                cDescritivo = this.selectedPropostaEtapaDesc.getDscEtapa2().concat(" ").concat("\n");
                aDescritivo.add(cDescritivo);
                aDescritivo.add(this.selectedPropostaEtapaDesc.getObsEtapa2().concat("\n"));
                // HONORARIOS
                cHonorarios = "";
                // Guarda os honorarios
                for (int j = 0; j < this.selectedPropostaEtapaDesc.getPropostaEtapaPercList().size(); j++) {
                    this.selectedPropostaEtapaPerc = this.selectedPropostaEtapaDesc.getPropostaEtapaPercList().get(j);

                    if (j == 0) {
                        cHonorarios = cEtapa.concat(" - ").concat(this.selectedPropostaEtapaPerc.getDscPerc().concat("\n"));
                        aHonorarios.add(cHonorarios);
                    } else {
                        cHonorarios = this.selectedPropostaEtapaPerc.getDscPerc().concat("\n");
                        aHonorarios.add(cHonorarios);
                    }
                }
                aHonorarios.set(aHonorarios.size() - 1, aHonorarios.get(aHonorarios.size() - 1).concat("\n"));
            }

            cDescritivo = "";
            for (String aDescritivo1 : aDescritivo) {
                cDescritivo += aDescritivo1;
            }
            cDescritivo += "\nHONORÁRIOS\n\n";

            for (String aHonorario : aHonorarios) {
                cDescritivo += aHonorario;
            }

            this.cEditor += cDescritivo;

            this.selectedPropostaModelo.setModelo(this.cEditor.concat("\n"));
        }
    }

    public Map<String, String> getEtapas() {
        return etapas;
    }

    public void setEtapas(Map<String, String> etapas) {
        this.etapas = etapas;
    }

    public String getItemlogo() {
        return itemlogo;
    }

    public void setItemlogo(String itemlogo) {
        this.itemlogo = itemlogo;
    }

    public void inserirMacro() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        this.cEditor = map.get("frmPropostaModelo:editorModelo");

        if (this.cEditor == null) {
            this.cEditor = "";
        }

        this.cEditor = this.cEditor.concat(this.itemlogo);
        this.selectedPropostaModelo.setModelo(this.cEditor);
        this.itemlogo = "";
    }

    public void exportarDocJOD(ActionEvent actionEvent) {
        String cCaminho = this.arquivo.getRealPath() + "/documento/";
        try {
            DocumentTemplateFactory documentTemplateFactory = new DocumentTemplateFactory();
            DocumentTemplate template = documentTemplateFactory.getTemplate(new File(cCaminho + "modelo_timbrado.odt"));
            Map model = new HashMap();
            model.put("nome", selectedPropostaModelo.getModelo());
            template.createDocument(model, new FileOutputStream(cCaminho + "modelo_proposta_teste.doc"));

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Modelo de Proposta Alterado com Sucesso", selectedPropostaModelo.getDscModelo());
        } catch (IOException | DocumentTemplateException e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedPropostaModelo.getDscModelo(), e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
}
